#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <string.h>
#include <semaphore.h>

int main(int argc, char const *argv[])
{
    char* shm_value_name = "unnamed_sem_shm_value";

    // 1、创建一个共享内存对象
    int value_fd = shm_open(shm_value_name,O_RDWR | O_CREAT, 0644);

    
    // 2、设置共享内存对象大小
    ftruncate(value_fd, sizeof(int));

    // 3、内存映射
    int* value = mmap(NULL, 1024, PROT_READ | PROT_WRITE, MAP_SHARED, value_fd, 0);

    *value = 0;

    // 4、使用内存映射实现进程间的通讯
    pid_t pid = fork();
    if(pid < 0)
    {
        perror("fork");
        exit(EXIT_FAILURE);
    }
    else if(pid == 0)
    {   
        // 子进程
        // 信号量等待

        int tmp = *value + 1;
        sleep(1);
        *value = tmp;

    }
    else
    {
        // 父进程


        int tmp = *value + 1;
        sleep(1);
        *value = tmp;


        // 等待子进程执行完毕
        waitpid(pid,NULL,0);
        printf("this is father, child finished\n");
        printf("the final value is %d\n", *value);
    }


    if(munmap(value, sizeof(sem_t)) == -1)
    {
        perror("munmap value");
    }

    if(close(value_fd) == -1)
    {
        perror("munmap value_fd");
    }
    // 6、释放共享内存对象
    shm_unlink(shm_value_name);

    return 0;
}
